package org.lvgo.singleton.lazy;

/**
 * 这种方式具备很好的 lazy loading，能够在多线程中很好的工作，
 * 但是，效率很低，99% 情况下不需要同步。
 * <p>
 * 优点：第一次调用才初始化，避免内存浪费。
 * 缺点：必须加锁 synchronized 才能保证单例，但加锁会影响效率。
 * <p>
 * getInstance() 的性能对应用程序不是很关键（该方法使用不太频繁）。
 *
 * @author lvgo
 * @version 1.0
 * @Description: 懒加载, 线程安全
 * @date 18-8-22 上午11:52
 */
public class LazyLoadingSingleton1 {

    private static LazyLoadingSingleton1 lazyLoadingSingleton1;

    private LazyLoadingSingleton1() {
        // 解决反射创建对象破解单例模式
        if (lazyLoadingSingleton1 == null) {
            lazyLoadingSingleton1 = this;
        } else {
            throw new IllegalStateException("Already initialized");
        }
    }

    public static synchronized LazyLoadingSingleton1 getInstance() {
        if (lazyLoadingSingleton1 == null) {
            lazyLoadingSingleton1 = new LazyLoadingSingleton1();
        }
        return lazyLoadingSingleton1;
    }

    /**
     * 解决反序列化创建对象破坏单例模式
     */
    private Object readResolve() {
        return lazyLoadingSingleton1;
    }
}
